From 77020684588748f4847de879d2b33d3a2f05c30c Mon Sep 17 00:00:00 2001 From: "cl349@arcadians.cl.cam.ac.uk" Date: Fri, 19 Nov 2004 11:47:49 +0000 Subject: [PATCH] bitkeeper revision 1.1159.181.1 (419ddd65nxpGF43pG96SSRICzT_NdA) evtchn.c: Make dynamic irq handlers safe to use with the unmodified irq probing code. irq.c: Remove changes to the irq probing code. --- .../arch/xen/i386/kernel/irq.c | 11 +++---- .../arch/xen/kernel/evtchn.c | 32 ++++++++++++++----- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/linux-2.6.9-xen-sparse/arch/xen/i386/kernel/irq.c b/linux-2.6.9-xen-sparse/arch/xen/i386/kernel/irq.c index c23ea80fb5..fa39b34310 100644 --- a/linux-2.6.9-xen-sparse/arch/xen/i386/kernel/irq.c +++ b/linux-2.6.9-xen-sparse/arch/xen/i386/kernel/irq.c @@ -695,7 +695,6 @@ void free_irq(unsigned int irq, void *dev_id) p = &desc->action; for (;;) { struct irqaction * action = *p; - if (action) { struct irqaction **pp = p; p = &action->next; @@ -757,7 +756,7 @@ unsigned long probe_irq_on(void) * something may have generated an irq long ago and we want to * flush such a longstanding irq before considering it as spurious. */ - for (i = NR_PIRQS-1; i > 0; i--) { + for (i = NR_IRQS-1; i > 0; i--) { desc = irq_desc + i; spin_lock_irq(&desc->lock); @@ -775,7 +774,7 @@ unsigned long probe_irq_on(void) * (we must startup again here because if a longstanding irq * happened in the previous stage, it may have masked itself) */ - for (i = NR_PIRQS-1; i > 0; i--) { + for (i = NR_IRQS-1; i > 0; i--) { desc = irq_desc + i; spin_lock_irq(&desc->lock); @@ -797,7 +796,7 @@ unsigned long probe_irq_on(void) * Now filter out any obviously spurious interrupts */ val = 0; - for (i = 0; i < NR_PIRQS; i++) { + for (i = 0; i < NR_IRQS; i++) { irq_desc_t *desc = irq_desc + i; unsigned int status; @@ -844,7 +843,7 @@ unsigned int probe_irq_mask(unsigned long val) unsigned int mask; mask = 0; - for (i = 0; i < NR_PIRQS; i++) { + for (i = 0; i < NR_IRQS; i++) { irq_desc_t *desc = irq_desc + i; unsigned int status; @@ -894,7 +893,7 @@ int probe_irq_off(unsigned long val) nr_irqs = 0; irq_found = 0; - for (i = 0; i < NR_PIRQS; i++) { + for (i = 0; i < NR_IRQS; i++) { irq_desc_t *desc = irq_desc + i; unsigned int status; diff --git a/linux-2.6.9-xen-sparse/arch/xen/kernel/evtchn.c b/linux-2.6.9-xen-sparse/arch/xen/kernel/evtchn.c index 9648518ae8..051657770c 100644 --- a/linux-2.6.9-xen-sparse/arch/xen/kernel/evtchn.c +++ b/linux-2.6.9-xen-sparse/arch/xen/kernel/evtchn.c @@ -70,7 +70,7 @@ static unsigned long pirq_needs_unmask_notify[NR_PIRQS/sizeof(unsigned long)]; /* Upcall to generic IRQ layer. */ extern asmlinkage unsigned int do_IRQ(int irq, struct pt_regs *regs); -#define VALID_EVTCHN(_chn) ((_chn) != -1) +#define VALID_EVTCHN(_chn) ((_chn) >= 0) /* * Force a proper event-channel callback from Xen after clearing the @@ -229,35 +229,51 @@ void unbind_evtchn_from_irq(int evtchn) static unsigned int startup_dynirq(unsigned int irq) { - unmask_evtchn(irq_to_evtchn[irq]); + int evtchn = irq_to_evtchn[irq]; + + if ( !VALID_EVTCHN(evtchn) ) + return 0; + unmask_evtchn(evtchn); return 0; } static void shutdown_dynirq(unsigned int irq) { - mask_evtchn(irq_to_evtchn[irq]); + int evtchn = irq_to_evtchn[irq]; + + if ( !VALID_EVTCHN(evtchn) ) + return; + mask_evtchn(evtchn); } static void enable_dynirq(unsigned int irq) { - unmask_evtchn(irq_to_evtchn[irq]); + int evtchn = irq_to_evtchn[irq]; + + unmask_evtchn(evtchn); } static void disable_dynirq(unsigned int irq) { - mask_evtchn(irq_to_evtchn[irq]); + int evtchn = irq_to_evtchn[irq]; + + mask_evtchn(evtchn); } static void ack_dynirq(unsigned int irq) { - mask_evtchn(irq_to_evtchn[irq]); - clear_evtchn(irq_to_evtchn[irq]); + int evtchn = irq_to_evtchn[irq]; + + mask_evtchn(evtchn); + clear_evtchn(evtchn); } static void end_dynirq(unsigned int irq) { + int evtchn = irq_to_evtchn[irq]; + if ( !(irq_desc[irq].status & IRQ_DISABLED) ) - unmask_evtchn(irq_to_evtchn[irq]); + unmask_evtchn(evtchn); } static struct hw_interrupt_type dynirq_type = { -- 2.30.2